package com.young.launch_task_init

import android.app.Application
import android.util.Log
import com.young.launch_task_init.core.InitManager
import com.young.launch_task_init.core.dispatcher.DefaultTaskDispatcher
import com.young.launch_task_init.core.group.BaseTaskGroup
import com.young.launch_task_init.core.group.LazyInitTaskGroup
import com.young.launch_task_init.core.group.MustInitTaskGroup
import com.young.launch_task_init.core.listener.SimpleOnCompletedListener
import com.young.launch_task_init.core.log.SimpleLog
import com.young.launch_task_init.core.task.base.ITask
import com.young.launch_task_init.demo.task.MmkvInitTask
import com.young.launch_task_init.demo.task.RongIMInitTask
import com.young.launch_task_init.demo.task_group.SecondTaskGroup

/**
 * Author：young
 * .
 * Time： 31/3/2023 上午9:51 周五
 * .
 * Desc：程序入口
 */
class App : Application() {

    companion object {
        // 任务执行进度监听
        var taskProgressListener: ((Int, Int) -> Unit)? = null

        // 所有任务完成回调监听
        var allTaskCompletedListener: Runnable? = null
    }

    override fun onCreate() {
        super.onCreate()


        // 使用 MustInitTaskGroup 分组
        val firstGroup = MustInitTaskGroup().also {
            it.addTask(MmkvInitTask())
            it.addTask(RongIMInitTask())
        }

        // 使用自定义分组
        val secondGroup = SecondTaskGroup()


        // 使用懒加载分组
        val lazyGroup = LazyInitTaskGroup().also {
            it.addTask(MmkvInitTask())
        }


        // 任务执行完成回调
        val onCompletedListener = object : SimpleOnCompletedListener() {

            override fun onTotalCompleted(
                task: ITask,
                taskGroup: BaseTaskGroup<*>,
                curProgress: Int,
                maxProgress: Int
            ) {
                taskProgressListener?.invoke(curProgress, maxProgress)
                Log.e(
                    "young_test",
                    "onTotalCompleted ${task::class.java.simpleName} curProgress=${curProgress} maxProgress=${maxProgress}"
                )
            }

            override fun onCompleted(elapsedTime: Long) {
                taskProgressListener = null
                allTaskCompletedListener?.run()
                allTaskCompletedListener = null
                Log.e(
                    "young_test",
                    "onCompleted"
                )
            }
        }

        // 懒加载任务执行完成回调
        val onLazyCompletedListener = object : SimpleOnCompletedListener() {

            override fun onTotalCompleted(
                task: ITask,
                taskGroup: BaseTaskGroup<*>,
                curProgress: Int,
                maxProgress: Int
            ) {
                Log.e(
                    "young_test",
                    "Lazy onTotalCompleted ${task::class.java.simpleName} curProgress=${curProgress} maxProgress=${maxProgress}"
                )
            }

            override fun onCompleted(elapsedTime: Long) {
                Log.e(
                    "young_test",
                    "Lazy onCompleted"
                )
            }

        }

        InitManager.builder(this, onCompletedListener) // 参数1是 Application，参数2是必须执行分组任务执行监听
            .addTaskGroup(lazyGroup) // 懒加载分组，再必须执行分组执行完毕后，才会执行，而且这里添加顺序没有关系
            .addTaskGroup(firstGroup) // 必须执行分组，第一组
            .addTaskGroup(secondGroup) // 必须执行分组，第二组，第一组执行完成，才会执行
            .setShowLog(true) // 设置是否打印任务执行信息
            .setOnLazyCompletedListener(onLazyCompletedListener) // 设置懒加载的监听，根据需求设置
            .setTaskDispatcher(DefaultTaskDispatcher()) // 设置任务执行分发器，可以不设置，有默认
            .setLog(SimpleLog) // 设置log 打印器，可以不设置，有默认
            .build() // 构建 InitManager
            .start() // 开始分发执行任务
    }


}